#include<bits/stdc++.h> 
using namespace std;
//	给定一些正整数N，你需要找到它的素数因子，使得N=p1^k1*p2^k2...pm^km
//1.每个输入包括一个测试用例，每个测试用例会给一个范围是long的正整数N
//2.对于每个测试用例，需要输出N=p1^k1*p2^k2... pm^km，其中pi是递增的素数，然后ki是对应的
//  幂次。当幂次=1时，不需要输出1
//3.素数，因式分解 
vector<int> P;	//因为因式分解要用到素数，判断素数也要用到，所以就把之前遇到的素数都存起来，可以大大节约时间 
bool isPrime(int n){
	for(unsigned int i = 0;i<P.size();i++){	//不再是一个一个试数，而是从比自己小的素数集合里拿出来看看自己素不素 
		if(n%P[i]==0) return false;
	} 
	return true;
}
int getNext(int t){
	if(t==2) return 3;
	for(int i=t+2;;i=i+2){	//两个两个找，找下一个素数 
		if(isPrime(i)) return i;
	}
}
int main(){
	unordered_map<int, int> p_k;
	set<int> s;
	long NN;
	cin>>NN;
	if(NN==1){	//测试点2 
		cout<<"1=1"<<endl;
		return 0;
	}
	long N = NN;
	int now_p = 2;	//从2开始因式分解 
	p_k[2] = 0;	//用map进行计数 
	P.push_back(2);
	while(N!=1){	//直到分解到1为止 
		if(N%now_p==0){
			s.insert(now_p);
			p_k[now_p] += 1;
			N /= now_p; 
		}
		else{
			now_p = getNext(now_p);
			p_k[now_p] = 0;
		}
	}
	set<int>::iterator it;
	cout<<NN<<"=";
	string ans = "";
	for(it=s.begin();it!=s.end();it++){
		if(p_k[*it]==0) continue;
		else if(p_k[*it]==1){
			stringstream ss;
			ss<<*(it);
			ans = ans + ss.str() + "*";
		}
		else{
			stringstream ss;
			ss<<*(it)<<"^"<<p_k[*it];
			ans = ans + ss.str() + "*";
		}
	}
	ans = ans.substr(0,ans.length()-1);
	cout<<ans<<endl;
	return 0;
} 